package com.jdbc_.transaction;

import com.jdbc_.utils.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

// 采用事务解决JDBC默认自动提交的问题
public class Demo {
    public static void main(String[] args) throws SQLException {
        Connection connection = JDBCUtils.getConnection();  // 获取连接
        PreparedStatement preparedStatement = null;

        try {
            // （一）将connection设置为不自动提交
            connection.setAutoCommit(false);  // 开启事务

            // 执行第一条sql语句
            String sql = "update account set balance=balance-1000 where id=1";  // 因为不用？，所以下面不用setXxx()方法
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.executeUpdate();

            int i = 1 / 0;  // 抛出异常，让第二条语句无法执行
            // 执行第二条sql语句
            String sql2 = "update account set balance=balance+1000 where id=2";
            preparedStatement = connection.prepareStatement(sql2);
            preparedStatement.executeUpdate();

            // （三）如果没哟发生异常，程序会执行到这里，所以在这里提交事务
            connection.commit();

        } catch (SQLException | ArithmeticException e) {
            System.out.println("SQL执行发生了异常，回滚，撤销事务");
            /*【注意】：捕捉到异常后，这里可以进行回滚，即撤销已执行的SQL语句*/
            // （二）rollback()：不写保存点，默认回滚到事务开启的状态
            connection.rollback();
            e.printStackTrace();
        } finally {
            // 关闭连接
            JDBCUtils.close(null, preparedStatement, connection);
        }
    }
}
